package com.xuyh.pdf.utils.jedis;

import cn.hutool.core.util.StrUtil;
import cn.hutool.http.HtmlUtil;
import cn.hutool.json.JSONObject;
import io.redisearch.Document;
import io.redisearch.Query;
import io.redisearch.Schema;
import io.redisearch.SearchResult;
import io.redisearch.client.Client;
import io.redisearch.client.IndexDefinition;
import lombok.extern.slf4j.Slf4j;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPooled;

import java.util.List;
import java.util.stream.Collectors;


/**
 * @author xuyh0817
 * @version 1.0.0
 * @email xuyh0817@foxmail.com
 * @date 2024/4/27 18:16
 * @doc
 * @website
 * @description 文章搜索工具类
 */
@Slf4j
public class ArticleSearchUtils {
    private final static String LANGUAGE_NAME = "chinese";
    /**
     * 标题
     */
    private final static String TITLE_NAME = "title";
    /**
     * 内容
     */
    private final static String CONTENT_NAME = "content";
    /**
     * 栏目
     */
    private final static String CATEGORY_NAME = "category";
    /**
     * 租户
     */
    private final static String TENANT_NAME = "tenantId";
    /**
     * 索引名称te
     */
    private final static String INDEX_NAME = "lite-cms-article";
    /**
     * 索引前缀
     */
    private final static String INDEX_PREFIX_NAME = "idx:cms:article";
//    private final static String INDEX_PREFIX_NAME = "";


    private static JedisPool jedisPool = new JedisPool("127.0.0.1", 51004, "default", "Mobile0604..");
    private static JedisPooled jedisPooled = new JedisPooled("127.0.0.1", 51004, "default", "Mobile0604..");

    private static JedisClient client = null;

    /**
     * 获取客户端
     *
     * @return Client
     */
    private static JedisClient getClient() {
        if (client == null) {
            synchronized (ArticleSearchUtils.class) {
                if (client == null) {
                    client = new JedisClient(INDEX_NAME, jedisPool);
                }
            }
        }
        return client;
    }

    public static void dropIndex() {
        JedisClient client = getClient();
        client.dropIndex(true);
    }

    public static void addDict() {
//        jedisPooled.ftCreate
//        jedisPooled.ftDictAdd()
//        jedisPooled.f
    }

    /**
     * 初始化索引
     */
    public static void createIndex() {
        JedisClient client = getClient();
        Schema sc = new Schema()
                // 添加标题
                .addTextField(TITLE_NAME, 1.0)
                // 添加内容
                .addTextField(CONTENT_NAME, 1.0)
                // 添加租户
                .addTextField(TENANT_NAME, 1.0)

                // 添加分类
                .addTextField(CATEGORY_NAME, 1.0);
        try {
            IndexDefinition rule = new IndexDefinition(IndexDefinition.Type.HASH)
                    // 语言类型
                    .setLanguage(LANGUAGE_NAME)
                    // 索引前缀名称
                    .setPrefixes(INDEX_PREFIX_NAME);
            Client.IndexOptions indexOptions = Client.IndexOptions.defaultOptions();
            indexOptions.setDefinition(rule);

            client.createIndex(sc, indexOptions);
            System.out.println(StrUtil.format("索引：{} 创建成功", INDEX_NAME));

        } catch (Exception e) {
            e.printStackTrace();
            System.out.println(StrUtil.format("索引：{} 已经存在", INDEX_NAME));
        }
    }

    /**
     * 添加文章索引
     */
    public static void addArticle() {

        String id = "1";
        // 删除文章索引
        deleteArticle(id);

        JedisClient client = getClient();
        JSONObject item = new JSONObject();
        item.set(TITLE_NAME, "李强会见几内亚比绍总统恩巴洛");
        item.set(CONTENT_NAME, "<p style=\"text-indent: 2em;\"><span style=\"font-family: 黑体;\">新华社北京7月10日电（记者许可）国务院总理李强7月10日上午在北京人民大会堂会见来华进行国事访问的几内亚比绍总统恩巴洛。<br><br></span></p><p style=\"text-indent: 2em;\"><span style=\"font-family: 黑体;\">李强表示，中国和几内亚比绍是可信赖的好兄弟、好伙伴。中方一贯重视发展与几内亚比绍友好合作关系。近年来，在两国元首战略指引下，双方传统友谊不断发扬光大，双边关系平稳顺利发展，取得了丰硕合作成果。习近平主席将同总统先生举行会谈，就事关双边关系的重大战略性问题深入交换意见，擘画两国关系新蓝图。中方愿同几内亚比绍一道努力，遵照两国元首指引的方向，巩固深化政治互信，不断拓展互利合作，更好实现共同发展，更多造福两国人民。</span></p><p style=\"text-align: center;\"><img src=\"/cmsfile/2024/07/12/d708db532ac09e72c892ec9c3b227917.jpg\" alt=\"6.jpg\" data-href=\"\" style=\"\"></p><p style=\"text-indent: 2em;\">7月10日上午，国务院总理李强在北京人民大会堂会见来华进行国事访问的几内亚比绍总统恩巴洛。新华社记者 殷博古 摄<br><br></p><p style=\"text-indent: 2em;\">李强指出，中国支持几内亚比绍人民自主探索符合本国国情的发展道路，支持几内亚比绍维护主权、安全和发展利益。中方愿同几内亚比绍加强发展战略对接，更多分享发展经验，务实高效推进合作，帮助几内亚比绍持续提升发展内生动力。双方要用好共建“一带一路”、中非合作论坛、中葡论坛等重要平台，深化农渔业、基础设施建设等领域合作，探讨开展更广泛领域合作。中方愿进口几内亚比绍更多优质农产品，鼓励中国企业扩大对几内亚比绍投资，希望几内亚比绍继续提供便利和支持。中方愿同几内亚比绍加强医疗卫生、教育等人文交流合作，欢迎更多几内亚比绍优秀学子来华留学深造。<br><br></p><p style=\"text-indent: 2em;\">恩巴洛表示，几内亚比绍同中国是相互尊重、患难与共的真诚朋友，两国关系有着特殊、坚实基础。对华关系对几内亚比绍至关重要，几内亚比绍衷心感谢中方长期以来为几内亚比绍经济社会发展给予的宝贵支持，愿同中方进一步加强经贸、基础设施建设等各领域务实合作，在共同发展的道路上继续并肩前行。几内亚比绍坚定恪守一个中国原则，支持习近平主席提出的推动构建人类命运共同体、共建“一带一路”等重大理念和全球倡议，愿同中方一道推动今秋在华举行的新一届中非合作论坛峰会取得丰硕成果。<br><br></p><p style=\"text-indent: 2em;\">吴政隆参加会见。</p><p style=\"text-indent: 2em;\"><br></p><p>文件：超高频词汇记忆法.pdf</p><div data-w-e-type=\"video\" data-w-e-is-void>\n" + "<iframe name=\"超高频词汇记忆法.pdf\" src=\"/cmsfile/2024/07/14/12c6dc5b11d4d82b6beff067d339f3d2.pdf\" width=\"800px\" height=\"80vh\"></div></iframe>\n" + "</div><p><br></p>");
        item.set(CATEGORY_NAME, "时政要闻");
        item.set(CONTENT_NAME, StrUtil.cleanBlank(HtmlUtil.cleanHtmlTag(item.getStr(CONTENT_NAME))));
        item.set(TENANT_NAME, "3");

        Document document = new Document(INDEX_PREFIX_NAME + StrUtil.COLON + id, item);

        client.addDocument(document);
    }

    /**
     * 删除文章
     *
     * @param id 文章id
     */
    public static void deleteArticle(String id) {
        JedisClient client = getClient();
        client.deleteDocument(INDEX_PREFIX_NAME + StrUtil.COLON + id);
    }

    /**
     * 查询文章
     *
     * @param queryValue 查询内容
     * @return SearchResult
     */
    public static List<Long> queryArticle(String queryValue) {
        JedisClient client = getClient();
        String queryKey = StrUtil.format("@{}:{} (@{}:{}|@{}:{}|@{}:{})", TENANT_NAME, 3, TITLE_NAME, queryValue, CONTENT_NAME, queryValue, CATEGORY_NAME, queryValue);
        Query q = new Query(queryKey).setNoContent().setLanguage(LANGUAGE_NAME).limit(0, 999);
        String explain = client.explain(q);
        System.out.println(explain);
        SearchResult search = client.search(q);
        System.out.println(search.docs);
        return search.docs.stream().map(item -> Long.valueOf(StrUtil.replace(item.getId(), INDEX_PREFIX_NAME + StrUtil.COLON, StrUtil.EMPTY))).distinct().collect(Collectors.toList());
    }
}
